/*
 * Copyright 2010-2016 OrientDB LTD (http://orientdb.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.orientechnologies.orient.test.database.base;

import com.orientechnologies.common.test.SpeedTestMultiThreads;
import com.orientechnologies.common.test.SpeedTestThread;
import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.util.OURLConnection;
import com.orientechnologies.orient.core.util.OURLHelper;

public abstract class OrientMultiThreadDBTest extends SpeedTestMultiThreads {
  private OrientDB context;
  private OURLConnection conn;

  public OrientMultiThreadDBTest(
      int iCycles, int iThreads, Class<? extends SpeedTestThread> iThreadClass) {
    super(iCycles, iThreads, iThreadClass);
  }

  @Override
  public void init() throws Exception {
    super.init();
    String url = System.getProperty("url");
    conn = OURLHelper.parse(url);
    context =
        new OrientDB(
            conn.getType() + ":" + conn.getPath(), "root", "root", OrientDBConfig.defaultConfig());
  }

  public void dropAndCreate() {
    String dbName = conn.getDbName();
    if (context.exists(dbName)) {
      context.drop(dbName);
    }

    context.execute(
        "create database ? plocal users(admin identified by 'admin' role admin)", dbName);
  }

  public ODatabaseSession openDB() {
    return context.open(conn.getDbName(), "admin", "admin");
  }

  public OrientDB getContext() {
    return context;
  }

  @Override
  public void deinit() throws Exception {
    context.close();
    super.deinit();
  }
}
